package com.dk.category.service;

import com.dk.feign.api.Category2AdminService;
import com.dk.category.constants.RedisConstants;
import com.dk.category.dto.CategoryDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Map;

@Service
public class RedisService {
    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private CategoryService categoryService;

    @Autowired
    private Category2AdminService category2AdminService;

    /**
     * 获取全部圈子
     */
    public List<CategoryDTO> getCircleList(Map<String, Object> params){
        List<CategoryDTO> circleList = null;

        // 先到redis缓存中获取数据
        circleList = (List<CategoryDTO>) redisTemplate.opsForHash().get(RedisConstants.HASH_KEY, RedisConstants.HASH_LIST_KEY);

        // 判断是否为空
        if (ObjectUtils.isEmpty(circleList)){
            // 缓存中没有数据，查询数据库
            circleList = categoryService.list(params);

            // 判断数据库是否存在
            if (ObjectUtils.isEmpty(circleList)){

                // 数据库中也没有数据，返回自定义内容，防止缓存穿透
                return null;
            }

            // 数据库存在，将数据存入redis
            redisTemplate.opsForHash().put(RedisConstants.HASH_KEY, RedisConstants.HASH_LIST_KEY, circleList);
        }

        return circleList;
    }

    /**
     * 获取热门圈子
     */
    public List<CategoryDTO> getHotCircleList() {
        // 默认热门圈子个数为10
        int defaultNum = 10;

        List<CategoryDTO> hotCircleList = null;

        // 先到redis缓存中获取数据
        hotCircleList = (List<CategoryDTO>) redisTemplate.opsForHash().get(RedisConstants.HASH_KEY, RedisConstants.HASH_HOT_KEY);

        // 判断是否为空
        if (ObjectUtils.isEmpty(hotCircleList)) {

            // 管理后台获取热门圈子数
            String circleHotNum = category2AdminService.getCircleHotNum(RedisConstants.CIRCLE_HOT_NUM_CODE);

            // 如果不为空，替换
            if (!ObjectUtils.isEmpty(circleHotNum)) {
                defaultNum = Integer.parseInt(circleHotNum);
            }

            // 缓存中没有数据，查询数据库
            hotCircleList = categoryService.getHot(defaultNum);

            // 同步redis缓存
            redisTemplate.opsForHash().put(RedisConstants.HASH_KEY, RedisConstants.HASH_HOT_KEY, hotCircleList);
        }
        return hotCircleList;
    }

    /**
     * 刷新redis缓存
     */
    public void refreshRedisCache() {
        // 删除redis缓存
        redisTemplate.delete(RedisConstants.HASH_KEY);

        // 获取热门圈子
        getHotCircleList();

        // 获取全部圈子
        getCircleList(null);
    }
}
